/*
状态模式（State Pattern）是一种行为型设计模式，它允许一个对象在其内部状态发生改变时改变其行为。
状态模式将对象的行为封装在不同的状态对象中，使得对象在不同的状态下具有不同的行为，而不需要使用大量的条件语句来判断对象的状态。

在状态模式中，主要有三个角色：上下文（Context）、抽象状态（State）和具体状态（Concrete State）。

● 上下文（Context）是包含状态的对象。它维护一个对当前状态对象的引用，并将其行为委托给当前状态对象处理。上下文可以通过改变其当前状态对象来改变其行为。
● 抽象状态（State）是定义状态的接口或抽象类。它定义了一个或多个抽象方法，用于处理上下文的请求，并可以改变上下文的状态。
● 具体状态（Concrete State）是抽象状态的具体实现。它实现了抽象状态定义的方法，并根据需要改变上下文的状态。

使用状态模式的主要优点是将对象的行为和状态解耦，使得状态的改变不会影响到对象的行为。
同时，状态模式也符合开闭原则，因为可以通过增加新的具体状态类来扩展系统的行为。

下面是一个使用状态模式的C语言例程，该例程模拟了一个电梯的状态变化：
*/

#include <stdio.h>
#include <stdlib.h>

// 抽象状态
typedef struct {
    void (*open)(void *state);
    void (*close)(void *state);
    void (*run)(void *state);
    void (*stop)(void *state);
} State;

// 具体状态
typedef struct {
    State state;
} ConcreteState;

void open(void *state) {
    printf("Opening the door...\n");
}

void close(void *state) {
    printf("Closing the door...\n");
}

void run(void *state) {
    printf("Running...\n");
}

void stop(void *state) {
    printf("Stopping...\n");
}

State *createState() {
    State *state = (State *)malloc(sizeof(State));
    state->open = open;
    state->close = close;
    state->run = run;
    state->stop = stop;
    return state;
}

void destroyState(State *state) {
    free(state);
}

// 上下文
typedef struct {
    State *state;
} Context;

void setState(Context *context, State *state) {
    context->state = state;
}

void openDoor(Context *context) {
    context->state->open(context->state);
}

void closeDoor(Context *context) {
    context->state->close(context->state);
}

void runElevator(Context *context) {
    context->state->run(context->state);
}

void stopElevator(Context *context) {
    context->state->stop(context->state);
}

int main() {
    Context *context = (Context *)malloc(sizeof(Context));
    context->state = createState();

    openDoor(context);
    closeDoor(context);
    runElevator(context);
    stopElevator(context);

    destroyState(context->state);
    free(context);

    return 0;
}

/*
在上面的例程中，首先定义了抽象状态接口State，其中包含了打开、关闭、运行和停止方法。
然后，定义了具体状态ConcreteState，它实现了抽象状态的方法。在createState函数中，创建了状态对象，并将方法设置为相应的函数。
接下来，定义了上下文Context，它包含了一个状态对象的引用。
在setState函数中，设置了上下文的状态对象。在openDoor、closeDoor、runElevator和stopElevator函数中，将上下文的请求委托给当前状态对象处理。
最后，在main函数中，创建了上下文对象，并通过上下文对象调用了不同的方法。

通过使用状态模式，我们可以根据对象的状态来改变其行为，而无需使用大量的条件语句。
状态模式使得对象的行为和状态解耦，使得系统更加灵活和可扩展。
*/